﻿using System.Collections.Generic;
using System.Linq;

namespace JH
{
    public static class FindCommonValueRealization
    {
        /// <summary>
        /// 在list1和list2中寻找共同的值，按索引顺序从前往后找，找到即停止
        /// 如果找到，返回值index1和index2分别存放各自的共同值索引
        /// 如果没找到，返回值index1和index2都为-1
        /// </summary>
        /// <remarks>对于引用类型，此方法使用默认的相等比较器，
        ///  请确保自定义类型的比较器正确，以及Equals和GetHashCode方法的实现。</remarks>
        public static bool FindCommonValueEm<T>(this IEnumerable<T> enumerable1, IEnumerable<T> enumerable2,
            out int index1, out int index2)
        {
            // 检查输入参数是否为空
            if (enumerable1 == null || enumerable2 == null)
            {
                index1 = index2 = -1;
                return false;
            }

            // 将输入的IEnumerable转换为List，以便于索引访问
            var list1 = enumerable1.ToList();
            var list2 = enumerable2.ToList();
    
            // 创建第二个列表的HashSet，用于快速查找
            var set2 = new HashSet<T>(list2);

            // 遍历第一个列表
            for (index1 = 0; index1 < list1.Count; index1++)
            {
                // 如果第二个集合中不包含当前元素，继续下一次循环
                if (!set2.Contains(list1[index1])) continue;

                // 找到共同元素，在第二个列表中查找其索引
                index2 = list2.IndexOf(list1[index1]);
                return true; // 找到共同元素，返回true
            }

            // 没有找到共同元素，设置索引为-1并返回false
            index1 = index2 = -1;
            return false;
        }
    }
}